在上一篇中,我們提到了CSS中,快速排版向的屬性:display: flex
。但有時,flex並不適用於較小且單一的元件,也無法協助我們更精細地刻出我們所想要的設計。因此,在本篇中,我將為您講解 ── position
屬性!
position在CSS中,是一種用來控制元件在頁面位置的屬性,下列將介紹數個可以賦予position
的值:
static(靜態位置)
static是position的默認值,所有網頁的元件都自帶一個position: static
的屬性。而所有被賦予static的元件都只會依照HTML的預設flow,自動排在頁面中,且無法被定位在頁面上的特定位置(即無法定義top, bottom, left, right)。
由於每個元件預設都自帶該屬性,所以通常是不會拿出來特地使用的。
fixed(固定位置)
fixed,常用於將元件固定在頁面上,其位置的參考點為整個畫面,不論您如何滑動,被賦予position: fixed
的元件都不會隨著頁面往下而消失,也不會影響到其他其他元件排列的狀況。
<body style="height: 200vh;">
<div class="fixed">fix元素</div>
<h3>1</h3>
<h3>2</h3>
<h3>3</h3>
<h3>4</h3>
<h3>5</h3>
<h3>6</h3>
<h3>7</h3>
<h3>8</h3>
<h3>9</h3>
<h3>10</h3>
</body>
.fixed {
position: fixed;
background-color: rgba(0, 255, 255, .8);
}
我們為「fix元素」藍底黑字的元件寫入了position fixed
的屬性,當我們將頁面滑下後可以看到:
該元件並沒有因為頁面下滑而消失,這便是fixed的作用。這種特性也使得屬性常用於各大網頁中的header 或 側列icon。
sticky(滾動黏滯定位)
與fixed屬性很像,但細微的差別在於,當某元件已被定位在特定位置A,則當文章往下滑動,並在A處碰到該元件時,它便會被固定在網頁的頁面上方,呈現fixed的樣式。
<body style="position: relative;">
<h2>1</h2>
<h2>2</h2>
<h2>3</h2>
<h2>4</h2>
<h2>5</h2>
<div style="background-color: red; color: white;">sticky element</div>
<h2>6</h2>
<h2>7</h2>
<h2>8</h2>
<h2>9</h2>
<h2>10</h2>
<h2>11</h2>
<h2>12</h2>
<h2>13</h2>
<h2>14</h2>
<h2>15</h2>
<h2>16</h2>
<h2>17</h2>
<h2>18</h2>
<h2>19</h2>
<h2>20</h2>
<h2>21</h2>
<h2>22</h2>
<h2>23</h2>
<h2>24</h2>
<h2>25</h2>
<h2>26</h2>
<h2>27</h2>
<h2>28</h2>
<h2>29</h2>
<h2>30</h2>
</body>
我們在數字五後面增加了一個sitcky element,然後再對該元件下一個 position: sticky; top: 0;
的樣式:
當使用者滑動網頁,並讓網頁頂端碰到數字5下方的sticky element後,該物件就會直接固定在網頁頂端跟著跑。
relative & absolute也是網頁設計師在時常給予position屬性中的值,在更深入地了解兩者的使用方式前,要先搞懂相對位置與絕對位置的差別。
小明家在大明家的隔壁。
小明家的裡面有廚房。
小明家在臺中市北區xxx里xxx路xx號xx樓。
<body>
<div style="
position: relative;
width: 200px;height: 200px;background-color: rgba(0, 242, 242, 0.512);">
relative element
</div>
</body>
這裡我們做了一個綠色的default元件,和一個藍色的relative元件進行對比:
我們可以直接對藍色的relative element下 top
left
right
bottom
去改變他的位置,請看示例:
<div style="
position: relative;
left: 100px;
top:50px;
width: 200px;height: 200px;background-color: rgba(0, 242, 242, 0.512);">
relative element
</div>
這裡我們下了 left:100px
top:50px
,輸出結果:
解釋一下,當我們下了 left:100px
top:50px
後,會以原位(虛線處)為基準點做位移:
這裡再額外補充一點,當我們對元件下了relative,並改變它的位置時,可以想像,此時我們的原位存有一個隱形的元件(虛線處)。如果我們後來又新增了一個元件時,此元件不會被往前替補,而是在虛線處後堆積:
我們將此特性稱為relative的碰撞框。
除此之外,relative也可以使元件與其他元件交疊在一起:
<div style="width: 200px;height: 200px;background-color: rgba(0, 242, 60, 0.512);">
default element
<div style="
position: relative;
width: 100px;height: 100px;background-color: rgb(0, 242, 242);
">
relative
</div>
</div>
而元件交疊的效果,我們可以使用另外一種定位的值來實現 ── 百分比(%數)
<div style="width: 200px;height: 200px;background-color: rgba(0, 242, 60, 0.512);">
default element
<div style="
position: relative;
width: 100px;height: 100px;background-color: rgb(0, 242, 242);
left: 20%;top: 50%;
">
relative
</div>
</div>
我們在這裡所使用的百分比,是以父元件的數值去做計算:
同理:
absolute的操作跟relative很像,同樣是對元件先下一個 position
的屬性後,便可以對其進行定位的操作。
我們方才在relative的部分有提到,relative是有碰撞框這一特性的,但absolute是沒有的。
則當一元素被下了absolute屬性後,該元件便會脫離預設的排列方式,重新以父元件(若無,則以網頁的整個視窗,即body,為基準)作為起點:
<body>
<div style="
position: relative;
width: 200px;height: 200px;background-color:rgba(0, 242, 60, 0.512);">
default element
</div>
<div style="
position: absolute;
width: 100px;height: 100px;background-color: rgb(242, 0, 0);">
absolute element
</div>
<div style="
position: relative;
width: 200px;height: 200px;background-color:rgba(0, 242, 60, 0.512);">
default element
</div>
</body>
這邊我們創建了一個綠色的default element 和 紅色的absolute element。不難發現,我們的absolute元件被蓋過去了。
tips:若想讓紅色的absolute元件浮現出來,可以對absolute元件下一個 z-index:100
的屬性。只要讓abdolute元件的z-index的值大於default元件的z-index值即可。
使用absolute以定位元件,同樣是使用 top
left
right
bottom
以改變元件的位置,我們直接看下列的示範:
<body>
<h3>relative和absolute通常會連著用</h3>
<div style="
position: relative;
width: 200px;height: 200px;background-color:rgba(0, 198, 242, 0.512);">
relative element
<div style="
position: absolute;
right: 0;
width: 100px;height: 100px;background-color: rgb(242, 0, 0);">
absolute element
</div>
</div>
<br>
<div style="
width: 200px;height: 200px;background-color:rgba(0, 242, 60, 0.512);">
default element
<div style="
position: absolute;
right: 0;
width: 100px;height: 100px;background-color: rgb(242, 0, 0);">
absolute element
</div>
</div>
</body>
此範例中,我們設置了兩個區塊,一藍一綠。一個下了relative的屬性,一個則維持預設。這兩者裡面都存有一個absolute元件,而兩者的absolute元件都下了 right:0
的定位。
究竟是甚麼原因,進而造成它們的不同呢?
→ 則,當紅色元件被下達right:0
後,會緊貼在藍色區塊的最右方。
→ 則,當紅色元件被下達right:0
後,會緊貼在網頁整體視窗的最右方。
購物網站常以 懸浮按鈕 來做為購物車的icon或為它們近期的活動做宣傳。
這種懸浮按鈕可以使用我們所學的position定位方法來實現!
範例:
蝦皮購物
木匠兄妹官網
接下來,我們要開始進行實作囉!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="init.css">
</head>
<body>
</body>
</html>
本次的範例一樣是使用 Jack Sharkey 所做的 css初始化包:https://css-init.com/
<!-- 蝦皮同款 -->
<section class="float-btn">
<div class="img-holder">
<img src="https://fakeimg.pl/100x100/">
</div>
<!-- close button -->
<button class="close-btn">X</button>
<!-- ticket -->
<div class="ticket">$299免運卷></div>
</section>
position:absolute
將整體定位到右下角。/* 定位元件 */
.float-btn {
position: absolute;
bottom: 5%;
right: 10%;
}
.img-holder {
/* 做圓 */
width: 100px;
height: 100px;
border-radius: 9999px;
overflow: hidden;
}
width:100px; height:100px
將圖片設置成一個 1:1 的方塊。border-radius: 9999px;
將圖片設為圓形。overflow:hidden;
隱藏圖片多出來的地方。叉叉的按鈕樣式:
.close-btn {
/* 按鈕樣式 */
border: 0;
padding: 0;
text-align: center;
/* 做圓 */
width: 20px;
height: 20px;
border-radius: 9999px;
}
border:0; padding:0;
將按鈕初始化。text-align:center
將叉叉的置中。ticket元件的樣式:
.ticket {
text-align: center;
font-size: 0.8rem;
font-weight: bold;
border-radius: 20px;
padding: 0.5rem 1rem;
background: #4B0516;
color: white;
}
text-align:center
將文字置中。font-size, font-weight
設定文字大小。border-radius
將ticket元件邊框圓角。padding: 0.5rem 1rem;
設定文字跟邊框的間距。background,color
為ticket元件設置顏色。left:50%; transform:translateX(-50%);
置中元件。
使元件靠向父元件的右邊50%,再往回自己的50%
.close-btn {
position: absolute;
right: 0;
top: 0;
}
.ticket {
position: absolute;
width: max-content;
left: 50%;
transform: translateX(-50%);
bottom: -15%;
}
如果寫出來跟範例長得不一樣,可以參考我的github。
https://github.com/ttdragon0722/it-iron-man/blob/master/day8/icon.html
以上!今天的position教學在此先告一段落,不知看完了整篇的教學的您,有沒有更了解position的定位方式與定位邏輯呢?